unit Vorlage;

interface

uses Classes, UOptionen;

Type TVorlage = class(TObject)
   Name           : String;
   Version        : String;
   FileAnzahl     : Integer;
   CopyFileAnzahl : Integer;
   AuswertungsArt_Einzel,
   AuswertungsArt_Doppel,
   AuswertungsArt_Alle_Spieler : AuswertungsTyp;
   Breite_Einzel,
   Breite_Doppel,
   Breite_Alle_Spieler,
   BreiteVereinEinzel,
   BreiteVereinDoppel,
   BreiteVereinTermin      : Integer;
   Filename     : TList;    { of String }
   FilenameCopy : TList;    { of String }

   Constructor Create(Var Eingabe:Text);
   Constructor CreateNew(VorlagenName, VorlagenVersion:String);
   Constructor CreateCopy(AlteVorlage:TVorlage);
   Destructor Destroy; override;

   Function Speichern(Var Ausgabe:Text):Integer;

   Function GetFilename( Filenr:Integer ):String;
   Function GetCopyFilename( Filenr:Integer ):String;
   Procedure AddFileName( Name:String );
   Procedure AddCopyFileName( Name:String );
End;

{ Die Vorlagenliste besteht aus einer Liste von Vorlagen }

Type TVorlagenListe = class(TObject)
   FileName : String;
   Anzahl   : Integer;
   Vorlagen : TList;    { of String }

   Constructor Create(Name_des_Files:String);
   Destructor Destroy; override;

   Function Speichern:Integer;
   Function GetAllFilename( Vorlage, Filenr:Integer ):String;
   Function GetFilename( Vorlage, Filenr:Integer ):String;
   Function GetCopyFilename( Vorlage, Filenr:Integer ):String;
   Function GetAllUrlname( Vorlage, Filenr:Integer ):String;
   Function GetUrlname( Vorlage, Filenr:Integer ):String;
   Function GetCopyUrlname( Vorlage, Filenr:Integer ):String;
   Function GetFileAnzahl( Vorlage:Integer ):Integer;
   Function GetCopyFileAnzahl( Vorlage:Integer ):Integer;
   Function GetVorlagenNummer( VorlagenName:String ):Integer; // -1 falls nicht gefunden
   Function GetVorlagenName( Vorlage:Integer ):String;
   Function GetVersion( VorlagenName:String ):String;
   Function GetVersionNr( Vorlage:Integer ):String;
   Function GetVorlage( VorlagenName:String ):TVorlage;
   Function GetVorlageByNr( Vorlage:Integer ):TVorlage;
   Procedure AddVorlage( VorlagenName, VorlagenVersion:String );
   Procedure Add( NeueVorlage: TVorlage);
   Procedure AddFileName( VorlagenName, FileName:String );
   Procedure AddCopyFileName( VorlagenName, FileName:String );
End;

Var InternetVorlagen : TVorlagenListe;
    Vorlagen         : TVorlagenListe;

// *************************************************************************

implementation

{$IFDEF Server}
Uses Konst;
{$ELSE}
Uses Dialogs, Konst;
{$ENDIF}

Constructor TVorlagenListe.Create(Name_des_Files:String);
Var Eingabe : Text;
    T       : Integer;
    Vorlage : TVorlage;
Begin
  {$I-}
  Vorlagen := TList.Create;
  AssignFile(Eingabe, NameInCurrentDir( Name_des_Files));
  Reset(Eingabe);
  FileName := Name_des_Files;
  If (IOResult = 0) then
  Begin
    Readln( Eingabe, Anzahl );
    If (IOResult = 0) then
     For T := 1 to Anzahl Do
     Begin
       Vorlage := TVorlage.Create( Eingabe );
       Vorlagen.Add(Vorlage);
     End
    else Anzahl := 0;
  End
  Else
  Begin
    Rewrite( Eingabe );
    Anzahl := 0;
  End;
  If IOResult = 0 then CloseFile(Eingabe);
  {$I+}
End;

Destructor TVorlagenListe.Destroy;
Var T : Integer;
Begin
  For T := 1 to Anzahl do
   Begin
    TVorlage(Vorlagen.Items[0]).Free;
    Vorlagen.Delete(0);
   End;
  Vorlagen.Free;
  inherited Destroy;
End;

Function TVorlagenListe.Speichern:Integer;
Var Fehler, T : Integer;
    Ausgabe   : Text;
Begin
 {$I-}
 Fehler := 0;
 AssignFile( Ausgabe, NameInCurrentDir( 'Dummy.Dat' ) );
 Rewrite( Ausgabe );
 Fehler := IOResult;
 If (Fehler = 0) then
   Begin
     Writeln( Ausgabe, Anzahl );
     Fehler := IOResult;
     T := 0;
     While ( Fehler = 0 ) And ( T < Anzahl ) Do
     Begin
       Fehler := TVorlage( Vorlagen.Items[T] ).Speichern( Ausgabe );
       Inc( T );
     End;
     CloseFile( Ausgabe );
     If (Fehler = 0) then
     Begin
       AssignFile( Ausgabe, NameInCurrentDir( FileName ));
       Reset( Ausgabe );
       If (IOResult = 0) Then
       Begin
         Close( Ausgabe );
         Erase( Ausgabe );
       End;
       Fehler := IOResult;
       AssignFile( Ausgabe, NameInCurrentDir( 'Dummy.dat' ));
       Rename( Ausgabe, NameInCurrentDir( FileName ) );
     End;
{$IFNDEF Server}
   End
 else MessageDlg( 'Fehler beim Speichern der Vorlage.', mtWarning, [mbOK], 0 );
{$ELSE}
   End;
{$ENDIF}
 {$I+}
 T := IOResult;
 Speichern := Fehler;
End;

Function TVorlagenListe.GetAllFilename( Vorlage, Filenr:Integer ):String;
Var CopyAnzahl : Integer;
Begin
  CopyAnzahl := GetCopyFileAnzahl( Vorlage );
  If FileNr < CopyAnzahl then
    GetAllFilename := TVorlage(Vorlagen.Items[Vorlage]).GetCopyFilename(Filenr)
  else GetAllFilename := TVorlage(Vorlagen.Items[Vorlage]).GetFilename(Filenr-CopyAnzahl);
End;

Function TVorlagenListe.GetFilename( Vorlage, Filenr:Integer ):String;
Begin
  GetFilename := TVorlage(Vorlagen.Items[Vorlage]).GetFilename(Filenr);
End;

Function TVorlagenListe.GetCopyFilename( Vorlage, Filenr:Integer ):String;
Begin
  GetCopyFilename := TVorlage(Vorlagen.Items[Vorlage]).GetCopyFilename(Filenr);
End;

Function TVorlagenListe.GetFileAnzahl( Vorlage:Integer ):Integer;
Begin
  GetFileAnzahl := TVorlage(Vorlagen.Items[Vorlage]).FileAnzahl;
End;

Function TVorlagenListe.GetCopyFileAnzahl( Vorlage:Integer ):Integer;
Begin
  GetCopyFileAnzahl := TVorlage(Vorlagen.Items[Vorlage]).CopyFileAnzahl;
End;

Function TVorlagenListe.GetVorlagenNummer( VorlagenName:String ):Integer;
Var T        : Integer;
    Gefunden : Boolean;
Begin
  T := 0;
  Gefunden := False;
  While (Not Gefunden) And (T < Anzahl) Do
  Begin
    If TVorlage(Vorlagen.Items[T]).Name = VorlagenName then
    Begin
      Gefunden := True;
      GetVorlagenNummer := T;
    End
    Else Inc( T );
  End;
  If (Not Gefunden) Then GetVorlagenNummer := -1;
End;

Function TVorlagenListe.GetVersion( VorlagenName:String ):String;
Var Nummer : Integer;
Begin
  Nummer := GetVorlagenNummer( VorlagenName );
  GetVersion := TVorlage(Vorlagen.Items[Nummer]).Version;
End;

Function TVorlagenListe.GetVersionNr( Vorlage:Integer ):String;
Begin
  GetVersionNr := TVorlage(Vorlagen.Items[Vorlage]).Version;
End;

Function TVorlagenListe.GetVorlagenName( Vorlage:Integer ):String;
Begin
  GetVorlagenName := TVorlage(Vorlagen.Items[Vorlage]).Name;
End;

Function TVorlagenListe.GetVorlage( VorlagenName:String ):TVorlage;
Var Nummer : Integer;
Begin
  Nummer := GetVorlagenNummer( VorlagenName );
  If Nummer >= 0 then GetVorlage := TVorlage(Vorlagen.Items[Nummer])
   else GetVorlage := Nil;
End;

Function TVorlagenListe.GetVorlageByNr( Vorlage:Integer ):TVorlage;
Var Nummer : Integer;
Begin
 GetVorlageByNr := TVorlage(Vorlagen.Items[Vorlage]);
End;

Function TVorlagenListe.GetAllUrlname( Vorlage, Filenr:Integer ):String;
Var Name     : String;
    Position : Integer;
Begin
  Name := GetAllFilename( Vorlage, Filenr );
  Position := Pos( '\', Name);
  While ( Position > 0 ) Do
  Begin
    Name := Copy(Name,1,Position-1) + '/' + Copy(Name,Position+1,Length(Name));
    Position := Pos( '\', Name);
  End;
  GetAllUrlname := Name;
End;

Function TVorlagenListe.GetUrlname( Vorlage, Filenr:Integer ):String;
Var Name     : String;
    Position : Integer;
Begin
  Name := GetFilename( Vorlage, Filenr );
  Position := Pos( '\', Name);
  While ( Position > 0 ) Do
  Begin
    Name := Copy(Name,1,Position-1) + '/' + Copy(Name,Position+1,Length(Name));
    Position := Pos( '\', Name);
  End;
  GetUrlname := Name;
End;

Function TVorlagenListe.GetCopyUrlname( Vorlage, Filenr:Integer ):String;
Var Name     : String;
    Position : Integer;
Begin
  Name := GetCopyFilename( Vorlage, Filenr );
  Position := Pos( '\', Name);
  While ( Position > 0 ) Do
  Begin
    Name := Copy(Name,1,Position-1) + '/' + Copy(Name,Position+1,Length(Name));
    Position := Pos( '\', Name);
  End;
  GetCopyUrlname := Name;
End;

Procedure TVorlagenListe.Add( NeueVorlage: TVorlage);
Var Nummer  : Integer;
    Vorlage : TVorlage;
Begin
  Nummer := GetVorlagenNummer( NeueVorlage.Name );
  If Nummer >= 0  then  // Vorlage schon da. Neue Version wird eingespielt
    Begin
      Dec( Anzahl );
      TVorlage(Vorlagen.Items[Nummer]).Free;
      Vorlagen.Delete(Nummer);
    End;
  Inc( Anzahl );
  Vorlagen.Add(NeueVorlage);
End;

Procedure TVorlagenListe.AddVorlage( VorlagenName, VorlagenVersion:String );
Var Nummer  : Integer;
    Vorlage : TVorlage;
Begin
  Nummer := GetVorlagenNummer( VorlagenName );
  If Nummer >= 0  then  // Vorlage schon da. Neue Version wird eingespielt
    Begin
      Dec( Anzahl );
      TVorlage(Vorlagen.Items[Nummer]).Free;
      Vorlagen.Delete(Nummer);
    End;
  Inc( Anzahl );
  Vorlage := TVorlage.CreateNew(VorlagenName, VorlagenVersion);
  Vorlagen.Add(Vorlage);
End;

Procedure TVorlagenListe.AddFileName( VorlagenName, FileName:String );
Var Nummer : Integer;
Begin
  Nummer := GetVorlagenNummer( VorlagenName );
  If Nummer >= 0 then
    TVorlage(Vorlagen.Items[Nummer]).AddFileName( FileName );
End;

Procedure TVorlagenListe.AddCopyFileName( VorlagenName, FileName:String );
Var Nummer : Integer;
Begin
  Nummer := GetVorlagenNummer( VorlagenName );
  If Nummer >= 0 then
    TVorlage(Vorlagen.Items[Nummer]).AddCopyFileName( FileName );
End;

// *************************************************************************

Constructor TVorlage.Create(Var Eingabe:Text);
Var T, F : Integer;
    S    : ^String;
    Help : String;
Begin
 {$I-}
 Filename := TList.Create;
 FilenameCopy := TList.Create;
 If (IOResult = 0) then
   Begin
     Readln( Eingabe, Name );
     Readln( Eingabe, Version );
     Readln(Eingabe, Help);
     AuswertungsArt_Einzel := Optionen.GetAuswertungsTyp(Help);
     Readln(Eingabe, Help);
     AuswertungsArt_Doppel := Optionen.GetAuswertungsTyp(Help);
     Readln(Eingabe, Help);
     AuswertungsArt_Alle_Spieler := Optionen.GetAuswertungsTyp(Help);
     Readln( Eingabe, Breite_Einzel );
     Readln( Eingabe, Breite_Doppel );
     Readln( Eingabe, Breite_Alle_Spieler );
     Readln( Eingabe, BreiteVereinEinzel );
     Readln( Eingabe, BreiteVereinDoppel );
     Readln( Eingabe, BreiteVereinTermin );

     Readln( Eingabe, Help );
     If Help = 'CopyFile' then
      Begin
       Readln( Eingabe, CopyFileAnzahl );
       For T := 1 to CopyFileAnzahl Do
         Begin
           new( S );
           Readln( Eingabe, S^ );
           FilenameCopy.Add(S);
         End;
       Readln( Eingabe, Help );
      end;

     Val(Help, FileAnzahl, F);
     For T := 1 to FileAnzahl Do
       Begin
         new( S );
         Readln( Eingabe, S^ );
         Filename.Add(S);
       End;
   End;
 {$I+}
End;

Constructor TVorlage.CreateNew(VorlagenName, VorlagenVersion :String);
Begin
  Name := VorlagenName;
  Version := VorlagenVersion;
  AuswertungsArt_Einzel := BilanzLZ;
  AuswertungsArt_Doppel := BilanzLZ;
  AuswertungsArt_Alle_Spieler := BilanzLZ;
  Breite_Einzel := 70;
  Breite_Doppel := 70;
  Breite_Alle_Spieler := 35;
  BreiteVereinEinzel := 20;
  BreiteVereinDoppel := 20;
  BreiteVereinTermin := 25;
  FileAnzahl := 0;
  Filename := TList.Create;
  CopyFileAnzahl := 0;
  FilenameCopy := TList.Create;
End;

Constructor TVorlage.CreateCopy(AlteVorlage:TVorlage);
Var T : Integer;
Begin
  Name                        := AlteVorlage.Name;
  Version                     := AlteVorlage.Version;
  AuswertungsArt_Einzel       := AlteVorlage.AuswertungsArt_Einzel;
  AuswertungsArt_Doppel        := AlteVorlage.AuswertungsArt_Doppel;
  AuswertungsArt_Alle_Spieler := AlteVorlage.AuswertungsArt_Alle_Spieler;
  Breite_Einzel               := AlteVorlage.Breite_Einzel;
  Breite_Doppel               := AlteVorlage.Breite_Doppel;
  Breite_Alle_Spieler         := AlteVorlage.Breite_Alle_Spieler;
  BreiteVereinEinzel          := AlteVorlage.BreiteVereinEinzel;
  BreiteVereinDoppel          := AlteVorlage.BreiteVereinDoppel;
  BreiteVereinTermin          := AlteVorlage.BreiteVereinTermin;

  FileAnzahl := 0;
  Filename := TList.Create;
  CopyFileAnzahl := 0;
  FilenameCopy := TList.Create;

  For T := 0 to AlteVorlage.CopyFileAnzahl-1 Do
    AddCopyFileName( AlteVorlage.GetCopyFilename( T ) );
  For T := 0 to AlteVorlage.FileAnzahl-1 Do
    AddFileName( AlteVorlage.GetFilename( T ) );
End;

Destructor TVorlage.Destroy;
Var T : Integer;
Begin
  For T := 1 to FileAnzahl do
   Begin
    Dispose( Filename.Items[0]);
    Filename.Delete(0);
   End;
  For T := 1 to CopyFileAnzahl do
   Begin
    Dispose( FilenameCopy.Items[0] );
    FilenameCopy.Delete(0);
   End;
  Filename.Free;
  FilenameCopy.Free;
  inherited Destroy;
End;

Function TVorlage.Speichern(Var Ausgabe:Text):Integer;
Var T, Fehler : Integer;
Begin
   Writeln( Ausgabe, Name );
   Writeln( Ausgabe, Version );
   Writeln(Ausgabe, Optionen.AuswertungString(AuswertungsArt_Einzel));
   Writeln(Ausgabe, Optionen.AuswertungString(AuswertungsArt_Doppel));
   Writeln(Ausgabe, Optionen.AuswertungString(AuswertungsArt_Alle_Spieler));
   Writeln(Ausgabe, Breite_Einzel);
   Writeln(Ausgabe, Breite_Doppel);
   Writeln(Ausgabe, Breite_Alle_Spieler);
   Writeln(Ausgabe, BreiteVereinEinzel);
   Writeln(Ausgabe, BreiteVereinDoppel);
   Writeln(Ausgabe, BreiteVereinTermin);

   Writeln(Ausgabe, 'CopyFile' );
   Writeln(Ausgabe, CopyFileAnzahl );
   T := 0;
   If Fehler = 0 then Fehler := IOResult;
   While (Fehler = 0) And (T < CopyFileAnzahl) Do
   Begin
     Writeln( Ausgabe, GetCopyFilename( T ) );
     Fehler := IOResult;
     Inc( T );
   End;

   Writeln(Ausgabe, FileAnzahl );
   T := 0;
   Fehler := IOResult;
   While (Fehler = 0) And (T < FileAnzahl) Do
   Begin
     Writeln( Ausgabe, GetFilename( T ) );
     Fehler := IOResult;
     Inc( T );
   End;

   Speichern := Fehler;
End;

Function TVorlage.GetFilename( Filenr:Integer ):String;
Begin
  GetFilename := String((Filename.Items[Filenr])^);
End;

Function TVorlage.GetCopyFilename( Filenr:Integer ):String;
Begin
  GetCopyFilename := String((FilenameCopy.Items[Filenr])^);
End;

Procedure TVorlage.AddFileName( Name:String );
Var S : ^String;
Begin
  new( S );
  S^ := Name;
  Filename.Add(S);
  Inc( FileAnzahl );
End;

Procedure TVorlage.AddCopyFileName( Name:String );
Var S : ^String;
Begin
  new( S );
  S^ := Name;
  FilenameCopy.Add(S);
  Inc( CopyFileAnzahl );
End;

// *************************************************************************

end.
